package main

import "fmt"

//定义一个HeroNode
type HeroNode struct {
	no       int
	name     string
	nickname string
	next     *HeroNode //这个表示指向下一个节点
}

//给链表插入一个节点
//编写第一种插入方法，在单链表的最后加入
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
	//1、先找到该链表的最后这个节点
	temp := head
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next //让temp不断的指向下一个节点
	}
	//2、将newHearNode加入到链表的最后
	temp.next = newHeroNode

}

//编写第二种插入方法，根据no的编号从小到大
func InsertHeroNodeSort(head *HeroNode, newHeroNode *HeroNode) {
	//1、先找到该链表的最后这个节点
	temp := head
	flag := true
	for {
		if temp.next == nil {
			break
		} else if temp.next.no >= newHeroNode.no {
			//说明newHeroNode就应该插入到temp后面
			break
		} else if temp.next.no == newHeroNode.no {
			//说明我们的链表中已经有这个no了，就不进行插入操作
			flag = false
			break
		}

		temp = temp.next //让temp不断的指向下一个节点
	}

	if !flag {
		fmt.Println("对不起，已经存在no=", newHeroNode.no)
		return
	} else {
		newHeroNode.next = temp.next
		temp.next = newHeroNode
	}

}

//删除一个节点
func DeleteHeroNode(head *HeroNode, id int) {
	temp := head
	//找到要删除的节点
	flag := false
	for {
		if temp.next == nil {
			break
		} else if temp.next.no == id {
			flag = true
			break
		}
		temp = temp.next
	}
	if flag {
		temp.next = temp.next.next
	} else {
		fmt.Println("要删除的id不存在，sorry！！！")
	}
}

//显示链表的所有节点信息
func ListHeroNode(head *HeroNode) {
	//1、创建一个辅助节点
	temp := head

	//2、先判断该链表是不是一个空链表
	if temp.next == nil {
		fmt.Println("该链表为空")
		return
	}

	//3、遍历该链表
	for {
		fmt.Printf("[%d, \t%s,\t%s]--->\n", temp.next.no, temp.next.name, temp.next.nickname)
		//判断是否为链表最后
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
}

func main() {
	//1、初始化一个头结点
	head := &HeroNode{}
	//2、创建一个新的HeroNode
	hero1 := &HeroNode{
		no:       1,
		name:     "宋江",
		nickname: "及时雨",
	}
	hero2 := &HeroNode{
		no:       2,
		name:     "卢俊义",
		nickname: "玉麒麟",
	}

	hero3 := &HeroNode{
		no:       3,
		name:     "林冲",
		nickname: "豹子头",
	}
	//hero4 := &HeroNode{
	//	no:       2,
	//	name:     "吴用",
	//	nickname: "智多星",
	//}

	//3、加入
	InsertHeroNodeSort(head, hero3)
	InsertHeroNodeSort(head, hero1)
	InsertHeroNodeSort(head, hero2)
	//InsertHeroNodeSort(head, hero4)
	DeleteHeroNode(head, 1)
	DeleteHeroNode(head, 2)
	ListHeroNode(head)
}
